import json
import random

from django import http
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View
from django_redis import get_redis_connection

from aijia_house.utils import constants
from apps.verifications.libs.captcha.captcha import captcha


class ImageCodeView(View):
    def get(self,request):
        # 1.获取传入的验证码编号，并判断编号是否有值
        cur = request.GET.get('cur')  # 当前图片验证码UUID
        pre = request.GET.get("pre")  # 前一个图片验证码UUID
        # 如果当前图片验证码UUID为None,直接返回参数有误响应
        if cur is None:
            return JsonResponse({'errno': 400, 'errmsg':'参数有误'})

        # 2.生成图片验证码
        text, image = captcha.generate_captcha()


        # 3.保存编号和其对应的图片验证码内容到redis
        redis_con = get_redis_connection('verify_code')  # type: StrictRedis
        if pre:
            # 3.1删除之前存储的验证码图片
            redis_con.delete("ImageCode_" + pre)
        redis_con.setex("ImageCode_" + cur, constants.IMAGE_CODE_REDIS_EXPIRES, text)

        # 4. 返回验证码图片
        return HttpResponse(image, content_type='image/jpg')


class SMSCodeView(View):
    def post(self, request):
        # - 1.接收参数 解析参数---路径参数mobile, 查询参数request.GET
        json_dict = json.loads(request.body.decode())
        mobile = json_dict.get('mobile')
        image_code_client = json_dict.get('image_code')
        uuid = json_dict.get('image_code_id')



        # 判空
        if not all([image_code_client, uuid]):
            return JsonResponse({'code': 400, 'errmsg': '参数不齐!'})
            # - 2.校验图片验证码 是否正确
            # - 2.1 链接redis数据库
        redis_conn = get_redis_connection('verify_code')
            # - 2.2 从redis 取出后端的图片验证码--img_uuid --'img_%s' % uuid
        image_code_server = redis_conn.get('img_%s' % uuid)
        # - 2.3 判断 后端的图片验证码 有没有
        if image_code_server is None:
            return http.JsonResponse({'code': 400, 'errmsg': '图片验证码失效了'})

        # - 2.校验图片验证码 是否正确
        # - 2.1 链接redis数据库
        redis_conn = get_redis_connection('verify_code')
        # - 2.2 从redis 取出后端的图片验证码--img_uuid --'img_%s' % uuid
        image_code_server = redis_conn.get('img_%s' % uuid)
        # - 2.3 判断 后端的图片验证码 有没有
        if image_code_server is None:
            return JsonResponse({'code': 400, 'errmsg': '图片验证码失效了'})

        # - 2.4 删除 后端的图片验证码 一次就失效
        try:
            redis_conn.delete('img_%s' % uuid)
        except Exception as e:
            print(e)
        # - 2.5 校验   前端图片验证码 == 后端图片验证码
        # redis取出来的 是bytes 类型 ---decode()
        image_code_server = image_code_server.decode('utf-8')
        if image_code_client.lower() != image_code_server.lower():

            return http.JsonResponse({'code': 400, 'errmsg': '图片验证码有误!'})


        # 后端 避免 发送短信过于频繁
        send_flag = redis_conn.get('send_flag_%s' % mobile)

        if send_flag:

            return http.JsonResponse({'code': 400, 'errmsg': '发送短信过于频繁'})





        # - 3.生成随机6位码---random.randint()--存储redis数据库 mobile:6位码
        sms_code = '%06d' % random.randint(0, 99999)

        print('短信验证码:', sms_code)

        phone_code = '%06d' % random.randint(0, 99999)

        print('短信验证码:', phone_code)


        # 3.2 存储redis数据库 mobile:6位码
        # 1.创建redis pipeline
        p1 = redis_conn.pipeline()
        # 2.将任务交给管道
        # 设置 发送短信过于频繁 标识
        p1.setex('send_flag_%s' % mobile, 60, 1)
        # 3.2 存储redis数据库 mobile:6位码
        redis_conn.setex('sms_%s' % mobile, 300, sms_code)
        p1.setex('sms_%s' % mobile, 300, sms_code)
        redis_conn.setex('sms_%s' % mobile, 300, phone_code)
        p1.setex('sms_%s' % mobile, 300, phone_code)
        # 3.管道执行
        p1.execute()

        # - 4.celery--异步调用 --使用第三方 容联云 发短信
        from celery_tasks.sms.tasks import ccp_send_sms_code
        ccp_send_sms_code.delay(mobile, sms_code)

        # - 5.返回响应对象
        return http.JsonResponse({'code': 0, 'errmsg': '发送短信成功!'})
        ccp_send_sms_code.delay(mobile, phone_code)

        # - 5.返回响应对象
        return JsonResponse({'code': 0, 'errmsg': '发送短信成功!'})




